/*
    读取三个矩形的坐标后，确定它们的整体覆盖范围，并将所有坐标平移到非负坐标系中。
    构建二维数组表示整块区域，依次标记每个矩形覆盖的格子，并记录每个格子的覆盖次数。
    遍历数组，统计被三个矩形同时覆盖的格子数，作为最终重叠区域面积。
*/

#include <stdio.h>      // 提供输入输出函数，如 printf、scanf
#include <stdlib.h>     // 提供内存分配函数，如 malloc、calloc、free
#include <limits.h>     // 用于定义最大最小整数值，如 INT_MAX、INT_MIN

#define MAX_RECTANGLES 3  // 矩形数量

int main() {
    // step 1# 初始化存储矩形信息的数组
    int x_coords[MAX_RECTANGLES * 2];      // 存储所有矩形的x坐标（每个矩形有2个x坐标）
    int y_coords[MAX_RECTANGLES * 2];      // 存储所有矩形的y坐标（每个矩形有2个y坐标）
    int rectangles[MAX_RECTANGLES][4];     // 存储所有矩形的左上角和右下角坐标 (x1, y1, x2, y2)
    int x1, y1, w, h;                       // 输入用：矩形左上角坐标及宽高
    int x2, y2;                             // 计算得出的右下角坐标

    // step 2# 输入矩形数据并计算右下角坐标
    for (int i = 0; i < MAX_RECTANGLES; i++) {
        scanf("%d %d %d %d", &x1, &y1, &w, &h);  // 读取矩形左上角坐标和宽高
        x2 = x1 + w;                             // 右下角x坐标 = 左上角x + 宽度
        y2 = y1 - h;                             // 右下角y坐标 = 左上角y - 高度

        x_coords[i * 2] = x1;                    // 存储x1
        x_coords[i * 2 + 1] = x2;                // 存储x2
        y_coords[i * 2] = y1;                    // 存储y1
        y_coords[i * 2 + 1] = y2;                // 存储y2

        rectangles[i][0] = x1;                   // 存储矩形左上角x
        rectangles[i][1] = y1;                   // 存储矩形左上角y
        rectangles[i][2] = x2;                   // 存储矩形右下角x
        rectangles[i][3] = y2;                   // 存储矩形右下角y
    }

    // step 3# 计算所有矩形的最小/最大x和y坐标
    int min_x_coord = INT_MAX;  // 初始化最小x为最大整数
    int max_x_coord = INT_MIN;  // 初始化最大x为最小整数
    int min_y_coord = INT_MAX;  // 初始化最小y为最大整数
    int max_y_coord = INT_MIN;  // 初始化最大y为最小整数

    // step 4# 查找x轴的最小值和最大值
    for (int i = 0; i < MAX_RECTANGLES * 2; i++) {
        if (x_coords[i] < min_x_coord) min_x_coord = x_coords[i];  // 更新最小x
        if (x_coords[i] > max_x_coord) max_x_coord = x_coords[i];  // 更新最大x
    }

    // step 5# 查找y轴的最小值和最大值
    for (int i = 0; i < MAX_RECTANGLES * 2; i++) {
        if (y_coords[i] < min_y_coord) min_y_coord = y_coords[i];  // 更新最小y
        if (y_coords[i] > max_y_coord) max_y_coord = y_coords[i];  // 更新最大y
    }

    // step 6# 计算偏移量，使所有坐标为非负数
    int x_offset = 0 - min_x_coord;  // x坐标偏移量（用于平移至非负）
    int y_offset = 0 - min_y_coord;  // y坐标偏移量

    // step 7# 计算二维数组大小（表示整个区域）
    int width = abs(max_x_coord - min_x_coord);    // 区域宽度
    int height = abs(max_y_coord - min_y_coord);   // 区域高度

    // step 8# 动态分配二维数组，初始化为0，表示交集区域
    int** intersection_area = (int**)malloc(width * sizeof(int*));  // 分配行指针
    for (int i = 0; i < width; i++) {
        intersection_area[i] = (int*)calloc(height, sizeof(int));   // 每行初始化为0
    }

    // step 9# 遍历每个矩形，并在二维数组中标记其覆盖区域
    for (int i = 0; i < MAX_RECTANGLES; i++) {
        int rect_x1 = rectangles[i][0];  // 当前矩形左上x
        int rect_y1 = rectangles[i][1];  // 当前矩形左上y
        int rect_x2 = rectangles[i][2];  // 当前矩形右下x
        int rect_y2 = rectangles[i][3];  // 当前矩形右下y

        // step 10# 填充该矩形区域，在数组中累加计数
        for (int x = (rect_x1 + x_offset); x < (rect_x2 + x_offset); x++) {
            for (int y = (rect_y2 + y_offset); y < (rect_y1 + y_offset); y++) {
                intersection_area[x][y] += 1;  // 被覆盖一次就加1
            }
        }
    }

    // step 11# 统计被所有三个矩形同时覆盖的格子数量
    int ret = 0;  // 用于存储重叠区域面积
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            if (intersection_area[i][j] == 3) ret += 1;  // 被3次覆盖表示完全重叠
        }
    }

    // step 12# 输出最终的重叠面积
    printf("%d\n", ret);  // 打印结果

    // step 13# 释放二维数组的内存
    for (int i = 0; i < width; i++) {
        free(intersection_area[i]);  // 释放每行
    }
    free(intersection_area);         // 释放行指针数组

    return 0;
}
